import axios from 'axios'
import {
	MessageBox,
	Message
} from 'element-ui'
import store from '@/store'
let service_url = null, //请求ip
	service //请求对象
if (process.env.NODE_ENV == 'development') {
	startApp("DEV_URL") //开发模式
} else {
	startApp("BUILD_URL") //生成模式
}
//获取配置文件
async function startApp(url_type) {
	let data = await axios.get('/config/config.json') //此路径是相对于服务器的路径
	if (url_type == 'DEV_URL') {
		service_url = data.data.DEV_URL
	} else {
		service_url = data.data.BUILD_URL
	}
	// 创建实例
	service = axios.create({
		baseURL: service_url, // url = base url + request url
		// withCredentials: true, // send cookies when cross-domain requests
		timeout: 60000, // request timeout
		headers: {
			'Content-Type': 'application/x-www-form-urlencoded' //转换data展现形式
		},
	})

	//请求拦截器
	service.interceptors.request.use(
		config => {
			// do something before request is sent

			if (store.getters.token) {
				// let each request carry token
				// ['X-Token'] is a custom headers key
				// please modify it according to the actual situation
				config.headers['Authorization'] = localStorage.getItem('token')
			}
			return config
		},
		error => {
			// do something with request error
			console.log(error) // for debug
			return Promise.reject(error)
		}
	)

	//响应拦截器
	service.interceptors.response.use(
		/**
		 * If you want to get http information such as headers or status
		 * Please return  response => response
		 */

		/**
		 * Determine the request status by custom code
		 * Here is just an example
		 * You can also judge the status by HTTP Status Code
		 */
		response => {
			const res = response.data

			// if the custom code is not 20000, it is judged as an error.
			if (res.code !== '200') {
				Message({
					message: res.message || 'Error',
					type: 'error',
					duration: 5 * 1000
				})

				// 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
				if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
					// to re-login
					MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again',
						'Confirm logout', {
							confirmButtonText: 'Re-Login',
							cancelButtonText: 'Cancel',
							type: 'warning'
						}).then(() => {
						store.dispatch('user/resetToken').then(() => {
							location.reload()
						})
					})
				}
				return Promise.reject(new Error(res.message || 'Error'))
			} else {
				return res
			}
		},
		error => {
			console.log('err' + error) // for debug
			Message({
				message: error.message,
				type: 'error',
				duration: 5 * 1000
			})
			return Promise.reject(error)
		}
	)
}



//请求接口
function doGet(url, req, successCallback, errorCallback) {
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'get',
			params: req
		}).then((response) => {
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}

function doPost(url, req, successCallback, errorCallback) {
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'post',
			data: req,
			transformRequest: [function(data) {//允许在向服务器发送前，修改请求数据
				let ret = ''
				for (let it in data) {
					ret += encodeURIComponent(it) + '=' + encodeURIComponent(data[it]) + '&'
				}
				return ret
			}],
		}).then((response) => {
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}

function doDelete(url, req, successCallback, errorCallback) {
	return new Promise((result, rejec) => {
		service({
			url: url,
			method: 'delete',
			data: req
		}).then((response) => {
			result(response)
			successCallback && successCallback(response);
		}).catch((err) => {
			rejec(err)
			errorCallback && errorCallback(err);
		})
	})
}



export default {
	doGet: doGet,
	doPost: doPost,
	doDelete: doDelete,
}
